package com.wanggy.mystore.intreceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 登录拦截器
 */
public class LoginInterceptor implements HandlerInterceptor {
    /**
     * 检查全局session对象中是否有uid数据，如果有则放行，如果没有则重定向到登录页面
     *
     * @param request  请求对象
     * @param response 响应对象
     * @param handler  处理器对象（把url 和 Controller映射到一块）
     * @return 返回值为true放行当前请求，返回值为false则重定向到登录页面
     * @throws Exception 异常
     */
    @Override
    //在DispatcherServlet调用所有请求的方法前自动调执行的方法
    //springboot会自动把请求对象给到request，响应对象给到response，处理器对象给到handler
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //通过HttpServletRequest对象获取session对象，然后通过session对象获取uid
        Object uid = request.getSession().getAttribute("uid");
        if (uid == null) {

            //重定向到登录页面，不能用相对路径，应为这里是要告诉前端访问的新页面是在哪个目录下的新页面
            //但前面的127.0.0.1:8088可以省略，因为在同一个项目下
            response.sendRedirect("/web/login.html");
            //结束后续的调用
            return false;

        } else {
            //放行这个请求
            return true;
        }
    }

    /**
     * 在请求处理完成后执行的方法
     * @param request 请求对象
     * @param response 响应对象
     * @param handler 处理器对象
     * @param modelAndView 视图对象
     * @throws Exception 异常
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    /**
     * 在请求处理完成后执行的方法
     * @param request 请求对象
     * @param response 响应对象
     * @param handler 处理器对象
     * @param ex 异常
     * @throws Exception 异常
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}
